# 导入需要用到的库
import cv2  # 图像处理库OpenCV
import numpy as np  # 数值计算和数组处理库NumPy
from PIL import Image  # 图像处理库Pillow中的Image模块，用于创建图像对象
from PIL import ImageDraw  # 图像处理库Pillow中的ImageDraw模块，用于绘制图像

# 创建numpy数组，用于存储像素
img = np.zeros((1000, 1000, 3), np.uint8) + 255  # 创建一个1000x1000x3的三通道数组，初始值全为255表示白色背景
# 将numpy数组转为Image对象
pil_img = Image.fromarray(img)  # 将NumPy数组转换为PIL库中的Image对象
# 获取ImageDraw.Draw()对象
draw = ImageDraw.Draw(pil_img)  # 获取一个可以在Image对象上绘制的Draw对象

# 定义Hermite函数，用于实现Hermite曲线的绘制
def Hermite(px1,py1,px2,py2,rx1,ry1,rx2,ry2):
    t=1.0/2000  # 采样间隔
    while t<1:
        t=t+1.0/2000  # 每次循环增加采样间隔
        x=(2*t**3-3*t*t+1)*px1+(-2*t**3+3*t*t)*px2+(t**3-2*t*t+t)*rx1+(t**3-t*t)*rx2  # 计算Hermite曲线上的x坐标
        y=(2*t**3-3*t*t+1)*py1+(-2*t**3+3*t*t)*py2+(t**3-2*t*t+t)*ry1+(t**3-t*t)*ry2  # 计算Hermite曲线上的y坐标
        draw.point((x, y), fill=(0, 0, 0))  # 绘制像素点
        # img[int(x), int(y)] = 1  # 可选：修改相应位置处的像素值

# 定义Bezier函数，用于实现Bezier曲线的绘制
def Bezier(x1,y1,x2,y2,x3,y3,x4,y4):
    t=1.0/2000  # 采样间隔
    while t<1:
        t=t+1.0/2000  # 每次循环增加采样间隔
        x = (1-t)**3*x1+3*(1-t)**2*t*x2+3*(1-t)*t**2*x3+t**3*x4  # 计算Bezier曲线上的x坐标
        y = (1-t)**3*y1+3*(1-t)**2*t*y2+3*(1-t)*t**2*y3+t**3*y4  # 计算Bezier曲线上的y坐标
        draw.point((x,y),fill=(0,0,0))  # 绘制像素点
        # img[int(x), int(y)] = 1  # 可选：修改相应位置处的像素值

# 定义B_yangtiao函数，用于实现样条曲线的绘制
def B_yangtiao(x1,y1,x2,y2,x3,y3,x4,y4):
    t=1.0/2000  # 采样间隔
    while(t<1):
        t=t+1.0/2000  # 每次循环增加采样间隔
        x=((1-t)**3)/6.0*x1+(3*t**3-6*t*t+4)/6.0*x2+(-3*t**3+3*t*t+3*t+1)/6.0*x3+(t**3)/6.0*x4  # 计算样条曲线上的x坐标
        y=((1-t)**3)/6.0*y1+(3*t**3-6*t*t+4)/6.0*y2+(-3*t**3+3*t*t+3*t+1)/6.0*y3+(t**3)/6.0*y4  # 计算样条曲线上的y坐标
        draw.point((x,y),fill=(0,0,0))  # 绘制像素点

# 调用Hermite函数进行曲线绘制
Hermite(380,230,450,390,200,350,400,200)
# 调用Bezier函数进行曲线绘制
Bezier(420,120,340,320,150,320,510,570)
# 调用B_yangtiao函数进行曲线绘制
B_yangtiao(210,320,410,420,650,250,850,200)

# 将Image对象转为numpy数组
img_array = np.array(pil_img)  # 调用np.array()方法将Image对象转换为NumPy数组
# 将numpy数组转为OpenCV图像
cv_img = cv2.cvtColor(img_array, cv2.COLOR_RGB2BGR)  # 将NumPy数组转换为OpenCV图像

# 显示OpenCV图像
cv2.imshow("image", cv_img)  # 显示OpenCV图像窗口，窗口名称为"image"
cv2.waitKey(0)  # 等待鼠标事件，直到用户关闭显示窗口
cv2.destroyAllWindows()  # 销毁OpenCV窗口并关闭程序